home *** CD-ROM | disk | FTP | other *** search
/ Hot Super Models / Hot Super Models.iso / unix / x11 / xv2r1.tar / xv2r1 / server / ddx / cfb32 / cfbrrop.c < prev    next >
C/C++ Source or Header  |  1991-09-25  |  6KB  |  217 lines

  1. /*
  2.  * $XConsortium: cfbrrop.c,v 1.4 91/01/27 13:03:00 keith Exp $
  3.  *
  4.  * Copyright 1989 Massachusetts Institute of Technology
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and its
  7.  * documentation for any purpose is hereby granted without fee, provided that
  8.  * the above copyright notice appear in all copies and that both that
  9.  * copyright notice and this permission notice appear in supporting
  10.  * documentation, and that the name of M.I.T. not be used in advertising or
  11.  * publicity pertaining to distribution of the software without specific,
  12.  * written prior permission.  M.I.T. makes no representations about the
  13.  * suitability of this software for any purpose.  It is provided "as is"
  14.  * without express or implied warranty.
  15.  *
  16.  * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
  17.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
  18.  * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  19.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  20.  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
  21.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  22.  *
  23.  * Author:  Keith Packard, MIT X Consortium
  24.  */
  25.  
  26. /* cfb reduced rasterop computations */
  27.  
  28. #include "X.h"
  29. #include "Xmd.h"
  30. #include "Xproto.h"
  31. #include "cfb.h"
  32. #include "cfbmskbits.h"
  33.  
  34. /* A description:
  35.  *
  36.  * There are four possible operations on each bit in the destination word,
  37.  *
  38.  *        1    2   3    4
  39.  *
  40.  *    0        0    0   1    1
  41.  *    1        0    1   0    1
  42.  *
  43.  * On examination of the reduced rop equation (dst = (dst & and) ^ xor),
  44.  * these four fall to reduced rops as follows:
  45.  *
  46.  *  and        0    1   1    0
  47.  *  xor        0    0   1    1
  48.  *
  49.  * or, (if 'and' is expensive) (dst = (dst | or) ^ xor)
  50.  *
  51.  *  or        1    0   0    1
  52.  *  xor        1    0   1    0
  53.  *
  54.  * The trouble with using this later equation is that trivial
  55.  * rasterop reduction is more difficult; some common rasterops
  56.  * use complicated expressions of xor/and instead of the simple
  57.  * ones while other common rasterops are not made any simpler:
  58.  *
  59.  * GXcopy:    *dst = ~xor        instead of  *dst = xor
  60.  * GXand:    *dst = *dst & ~or    instead of  *dst = *dst & and
  61.  * GXor:    *dst = *dst | or    instead of  *dst = *dst | xor
  62.  * GXxor:    *dst = *dst ^ xor    instead of  *dst = *dst ^ xor
  63.  *
  64.  * If you're really set on using this second mechanism, the changes
  65.  * are pretty simple.
  66.  *
  67.  * All that remains is to provide a mechanism for computing and/xor values
  68.  * based on the raster op and foreground value.
  69.  *
  70.  * The 16 rops fall as follows, with the associated reduced
  71.  * rop and/xor and or/xor values.  The values in parenthesis following the
  72.  * reduced values gives an equation using the source value for
  73.  * the reduced value, and is one of {0, src, ~src, 1} as appropriate.
  74.  *
  75.  *    clear        and        andReverse    copy
  76.  *     src  0    1        0   1        0    1        0    1
  77.  *  dst    0   0    0    0   0   0    0   0    1    0   0    1
  78.  *    1   0    0    1   0   1    1   0    0    1   0    1
  79.  *
  80.  *  and        0    0 (0)        0   1 (src)        0    1 (src)        0    0 (0)
  81.  *  xor        0    0 (0)        0   0 (0)        0    1 (src)        0    1 (src)
  82.  *
  83.  *  or        1    1 (1)        1    0 (~src)    1    0 (~src)    1    1 (1)
  84.  *  xor        1    1 (1)        1    0 (~src)    1    1 (1)        1    0 (~src)
  85.  *
  86.  *    andInverted    noop        xor        or
  87.  *     src  0    1        0   1        0    1        0    1
  88.  *  dst    0   0    0    0   0   0    0   0    1    0   0    1
  89.  *    1   1    0    1   1   1    1   1    0    1   1    1
  90.  *
  91.  *  and        1    0 (~src)    1   1 (1)        1    1 (1)        1    0 (~src)
  92.  *  xor        0    0 (0)        0   0 (0)        0    1 (src)        0    1 (src)
  93.  *
  94.  *  or        0    1 (src)        0    0 (0)        0    0 (0)        0    1 (src)
  95.  *  xor        0    1 (src)        0    0 (0)        0    1 (src)        0    0 (0)
  96.  *
  97.  *    nor        equiv        invert        orReverse
  98.  *     src  0    1        0   1        0    1        0    1
  99.  *  dst    0   1    0    0   1   0    0   1    1    0   1    1
  100.  *    1   0    0    1   0   1    1   0    0    1   0    1
  101.  *
  102.  *  and        1    0 (~src)    1   1 (1)        1    1 (1)        1    0 (~src)
  103.  *  xor        1    0 (~src)    1   0 (~src)    1    1 (1)        1    1 (1)
  104.  *
  105.  *  or        0    1 (src)        0    0 (0)        0    0 (0)        0    1 (src)
  106.  *  xor        1    1 (1)        1    0 (~src)    1    1 (1)        1    0 (~src)
  107.  *
  108.  *    copyInverted    orInverted    nand        set
  109.  *     src  0    1        0   1        0    1        0    1
  110.  *  dst    0   1    0    0   1   0    0   1    1    0   1    1
  111.  *    1   1    0    1   1   1    1   1    0    1   1    1
  112.  *
  113.  *  and        0    0 (0)        0   1 (src)        0    1 (src)        0    0 (0)
  114.  *  xor        1    0 (~src)    1   0 (~src)    1    1 (1)        1    1 (1)
  115.  *
  116.  *  or        1    1 (1)        1    0 (~src)    1    0 (~src)    1    1 (1)
  117.  *  xor        0    1 (src)        0    0 (0)        0    1 (src)        0    0 (0)
  118.  */
  119.  
  120. int
  121. cfbReduceRasterOp (rop, fg, pm, andp, xorp)
  122.     int            rop;
  123.     unsigned long   fg, pm;
  124.     unsigned long   *andp, *xorp;
  125. {
  126.     unsigned long   and, xor;
  127.     int            rrop;
  128.  
  129.     fg = PFILL (fg);
  130.     pm = PFILL (pm);
  131.     switch (rop)
  132.     {
  133.     case GXclear:
  134.         and = 0;
  135.         xor = 0;
  136.     break;
  137.     case GXand:
  138.     and = fg;
  139.     xor = 0;
  140.     break;
  141.     case GXandReverse:
  142.     and = fg;
  143.     xor = fg;
  144.     break;
  145.     case GXcopy:
  146.     and = 0;
  147.     xor = fg;
  148.     break;
  149.     case GXandInverted:
  150.     and = ~fg;
  151.     xor = 0;
  152.     break;
  153.     case GXnoop:
  154.     and = ~0;
  155.     xor = 0;
  156.     break;
  157.     case GXxor:
  158.     and = ~0;
  159.     xor = fg;
  160.     break;
  161.     case GXor:
  162.     and = ~fg;
  163.     xor = fg;
  164.     break;
  165.     case GXnor:
  166.     and = ~fg;
  167.     xor = ~fg;
  168.     break;
  169.     case GXequiv:
  170.     and = ~0;
  171.     xor = ~fg;
  172.     break;
  173.     case GXinvert:
  174.     and = ~0;
  175.     xor = ~0;
  176.     break;
  177.     case GXorReverse:
  178.     and = ~fg;
  179.     xor = ~0;
  180.     break;
  181.     case GXcopyInverted:
  182.     and = 0;
  183.     xor = ~fg;
  184.     break;
  185.     case GXorInverted:
  186.     and = fg;
  187.     xor = ~fg;
  188.     break;
  189.     case GXnand:
  190.     and = fg;
  191.     xor = ~0;
  192.     break;
  193.     case GXset:
  194.     and = 0;
  195.     xor = ~0;
  196.     break;
  197.     }
  198.     and |= ~pm;
  199.     xor &= pm;
  200.     *andp = and;
  201.     *xorp = xor;
  202.     /* check for some special cases to reduce computation */
  203.     if (and == 0)
  204.     rrop = GXcopy;
  205.     else if (and == ~0)
  206.     rrop = GXxor;
  207.     else if (xor == 0)
  208.     rrop = GXand;
  209.     else if (and | xor == ~0)
  210.     rrop = GXor;
  211.     else if (and == ~0 && xor == 0)
  212.     rrop = GXnoop;
  213.     else
  214.     rrop = GXset;   /* rop not reduced */
  215.     return rrop;
  216. }
  217.